package org.hibernate.search.test.integration.jbossjta;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
import org.apache.lucene.search.Query;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.cfg.Environment;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.ejb.HibernatePersistence;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.search.test.integration.jbossjta.infra.JBossTADataSourceBuilder;
import org.hibernate.search.test.integration.jbossjta.infra.JBossTSStandaloneTransactionManagerLookup;
import org.hibernate.search.test.integration.jbossjta.infra.PersistenceUnitInfoBuilder;
import org.hibernate.search.util.impl.FileHelper;
/**
* @author Emmanuel Bernard
*/
public class JBossTSTest {
private static EntityManagerFactory factory;
public static File tempDirectory = new File( "./test-tmp" );
@BeforeClass
public static void setUp() throws Exception {
FileHelper.delete( tempDirectory );
tempDirectory.mkdir();
//DataSource configuration
final String url = "jdbc:h2:file:./test-tmp/h2db";
final String user = "sa";
final String password = "";
//H2 DataSource creation
final JdbcDataSource underlyingDataSource = new JdbcDataSource();
underlyingDataSource.setURL( url );
underlyingDataSource.setUser( user );
underlyingDataSource.setPassword( password );
//build JBoss-bound DataSource
DataSource ds = new JBossTADataSourceBuilder()
.setXADataSource( underlyingDataSource )
.setUser( user )
.setPassword( password )
.setTimeout( 0 ) //infinite transaction
.createDataSource();
PersistenceUnitInfoBuilder pub = new PersistenceUnitInfoBuilder();
final PersistenceUnitInfo unitInfo = pub
.setExcludeUnlistedClasses( true )
.setJtaDataSource( ds )
.setPersistenceProviderClassName( HibernatePersistence.class.getName() )
.setPersistenceUnitName( "jbossjta" )
.setPersistenceXMLSchemaVersion( "2.0" )
.setSharedCacheMode( SharedCacheMode.NONE )
.setValidationMode( ValidationMode.NONE )
.setTransactionType( PersistenceUnitTransactionType.JTA )
.addManagedClassNames( Tweet.class.getName() )
.addProperty(
"hibernate.transaction.manager_lookup_class",
JBossTSStandaloneTransactionManagerLookup.class.getName()
)
.addProperty( "hibernate.dialect", H2Dialect.class.getName() )
.addProperty( Environment.HBM2DDL_AUTO, "create-drop" )
.addProperty( Environment.SHOW_SQL, "true" )
//I don't pool connections by JTA transaction. Leave the work to Hibernate Core
.addProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_TRANSACTION.toString() )
.addProperty( "hibernate.search.default.directory_provider", "ram" )
.create();
final HibernatePersistence hp = new HibernatePersistence();
factory = hp.createContainerEntityManagerFactory( unitInfo, new HashMap( ) );
}
@AfterClass
public static void tearDown() {
factory.close();
FileHelper.delete( tempDirectory );
}
@Test
public void testJBossTS() throws Exception {
TransactionManagerImple tm = new TransactionManagerImple();
tm.begin();
EntityManager em = factory.createEntityManager();
Tweet tweet = new Tweet( "Spice is the essence of life" );
em.persist( tweet );
tm.commit();
em.close();
tm.begin();
em = factory.createEntityManager();
FullTextEntityManager ftem = Search.getFullTextEntityManager( em );
final QueryBuilder builder = ftem.getSearchFactory().buildQueryBuilder().forEntity( Tweet.class ).get();
final Query query = builder
.keyword()
.onField( "text" )
.matching( "spice" )
.createQuery();
ftem.createFullTextQuery( query, Tweet.class ).getResultList();
final List resultList = em.createQuery( "from " + Tweet.class.getName() ).getResultList();
Assert.assertEquals( 1, resultList.size() );
for (Object o : resultList) {
em.remove( o );
}
tm.commit();
em.close();
}
}